#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
using namespace std;

//template <char N = 'a',class T, size_t NN = 20>
//void func(T num)
//{
//
//}

//template<class T, size_t N = 10>
//void func(T a)
//{
//	cout << N << endl;
//}
//
//int main()
//{
//	func(1);
//	return 0;
//}
//
//template<>
//bool Less<int>(int& a, int& b)
//{
//	return a < b;
//}

//template<class T1, class T2>
//class A
//{
//public:
//	void func()
//	{
//		cout << "A" << endl;
//	}
//
//};
//
//template<>
//class A<int, int>
//{
//public:
//	void func()
//	{
//		cout << "A<int, int>" << endl;
//	}
//
//};
//
//template<class T1>
//class A<T1, char>
//{
//public:
//	void func()
//	{
//		cout << "A<T1, char>" << endl;
//	}
//
//};
//
//template<class T2>
//class A<double, T2>
//{
//public:
//	void func()
//	{
//		cout << "A<double, T2>" << endl;
//	}
//};
//
//
//template<class T1, class T2>
//class A<T1*, T2*>
//{
//public:
//	void func()
//	{
//		cout << "A<T1*, T2*>" << endl;
//	}
//};
//
//template<class T2>
//class A<char, T2*>
//{
//public:
//	void func()
//	{
//		cout << "A<char, T2*>" << endl;
//	}
//};
//
//int main()
//{
//	/*A<long, long> a1;*/
//	A<int, int> a2;
//	//A<int, char> a3;
//	A<double, int> a4;
//	//A<int*, int*> a5;
//	//A<char, double*> a6;
//
//	//a1.func();
//	a2.func();
//	//a3.func();
//	a4.func();
//	//a5.func();
//	//a6.func();
//
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	return 0;
//}

//template<class T>
//bool Less(T a, T b)
//{
//	return a < b;
//}
//
//template<>
//bool Less<string*>(string* a, string* b)
//{
//	return *a < *b;
//}
//
//bool Less(string* a, string* b)
//{
//	return *a < *b;
//}
//
//int main()
//{
//	string str1 = "a";
//	string str2 = "b";
//	string* ptr1 = &str1;
//	string* ptr2 = &str2;
//
//	cout << Less(str1, str2) << endl;
//	cout << Less(ptr1, ptr2) << endl;
//
//	return 0;
//}


template<class T>
struct Less
{
	bool operator() (T a, T b)
	{
		return a < b;
	}
};

template <class T>
struct Less<T*>
{
	bool operator() (T* a, T* b)
	{
		return *a < *b;
	}
};

int main()
{
	Less<string*> Le;
	string str1 = "a";
	string str2 = "b";
	string* ptr1 = &str1;
	string* ptr2 = &str2;

	cout << Less<string>()(str1, str2) << endl;
	cout << Le(ptr1, ptr2) << endl;

	return 0;
}